const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
const port = 7000;
const http = require('http');
const fs = require('fs');
const archiver = require('archiver');

const { utilJavaApiParser } = require('./java_api/u_api_parser');
const { utilTemplate } = require('./java_api/u_template');

// 设置静态文件目录（多个目录）
app.use(express.static('public')); // 服务 public 文件夹下的静态文件
app.use('/assets', express.static('assets')); // 可以通过 /assets 路径访问 assets 文件夹

// 或者指定绝对路径
app.use('/static', express.static(path.join(__dirname, 'public')));


async function getApiJson(url) {
    return new Promise((resolve, reject) => {

        // 简单的 GET 请求
        http.get(url, (res) => {
            let data = '';
            // 接收数据流
            res.on('data', (chunk) => {
                data += chunk;
            });

            // 响应完成
            res.on('end', () => {
                console.log('状态码:', res.statusCode === 200);
                // console.log('响应头:', res.headers);
                // console.log('响应体:', data);
                // fs.writeFileSync(path.join(__dirname, 'tmp/api.json'), data, 'utf8');
                const json = JSON.parse(data);
                fs.writeFileSync(path.join(__dirname, 'tmp/api.json'), JSON.stringify(json, null, 2), 'utf8');
                const schemas = utilJavaApiParser.parseSchemas(json, (key) => {
                    if (key === '响应结果') return true;
                    if (key == 'R') return true;
                    if (key == 'PageVo') return true;
                    //有泛型的类忽略
                    if (key.indexOf('«') > -1) return true;
                    if (key == 'Page') return true;
                    return false;
                });
                const now = new Date();
                const time = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()} ${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`
                let timeHeader = `// 生成时间 ${time} \n`;
                console.log(timeHeader);
                const httpList = utilJavaApiParser.parsePaths(json, '/dev-api');
                fs.writeFileSync(path.join(__dirname, 'public/tmp/class.d.ts'), timeHeader + utilTemplate.genInterface(schemas), 'utf8');
                timeHeader = `//MARK: 接口数量: ${httpList.length}\n//--\n//--\n//--\n//--\n` + timeHeader;
                fs.writeFileSync(path.join(__dirname, 'public/tmp/http.d.ts'), timeHeader + utilTemplate.genInterface(httpList), 'utf8');
                resolve({
                    urls: [
                        '/tmp/class.d.ts',
                        '/tmp/http.d.ts',
                    ]
                });
            });

        }).on('error', (err) => {
            console.error('请求错误:', err);
            reject(err);
        });
    });
}
app.post('/api/gen_code', async (req, res, next) => {
    const { url } = req.body;
    console.log(url);
    let error = undefined;
    const data = await getApiJson(url).catch((err) => { error = err });

    if (data) {
        res.json({ code: 0, data });
    } else {
        res.json({ code: -1, error });
    }
});
app.get('/download', async (req, res, next) => {
    const files = [
        path.join(__dirname, 'public/tmp/class.d.ts'),
        path.join(__dirname, 'public/tmp/http.d.ts'),
    ];

    // 验证所有文件都存在
    for (const file of files) {
        if (!fs.existsSync(file)) {
            return res.status(404).send('文件不存在');
        }
    }

    // 设置响应头
    res.setHeader('Content-Disposition', 'attachment; filename="files.zip"');
    res.setHeader('Content-Type', 'application/zip');

    // 创建archiver实例
    const archive = archiver('zip', {
        zlib: { level: 9 } // 最高压缩级别
    });

    // 处理错误
    archive.on('error', (err) => {
        console.error('压缩错误:', err);
        res.status(500).send('压缩失败');
    });

    // 管道传输到响应
    archive.pipe(res);

    const reg = /[^\/\\]+$/;
    // 添加文件到压缩包
    files.forEach((filePath, index) => {
        const ret = filePath.match(reg);
        let fileName = `文档${index + 1}.txt`;
        if (ret) {
            fileName = ret[0];
        }


        archive.file(filePath, { name: fileName });
    });

    // 完成压缩
    archive.finalize();
});

// 启动服务器
app.listen(port, () => {
    console.log(`静态服务器运行在 http://localhost:${port}`);
    console.log(`静态文件目录: ${path.join(__dirname, 'public')}`);
});